﻿/*----------------------------------------------------------------
// Copyright (C) 梦幻天堂
// 版权所有。 
//
// 文件名：BusinessDDLBase.cs
// 文件功能描述：控件DropDownList扩展类 包括数据绑写模式和数据默认填充
//
// 
// 创建标识：田银
// 创建时间：2011/11/7
//
//修改标识：
//修改描述：
//
//----------------------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Web.UI.WebControls;
using System.Web.UI;

namespace LYM.CommonWeb.Controls
{
    /// <summary>
    /// 绑定模式
    /// </summary>
    public enum EnumDelayBindType
    {
        /// <summary>
        /// 将在OnInit绑定
        /// </summary>
        Auto = 0,
        /// <summary>
        /// 将在OnLoad后绑定,设置查询范围属性,自动加载
        /// </summary>
        ConditionAuto = 1,
        /// <summary>
        /// 完全手工操作
        /// </summary>
        Manual = 2
    }

    [Localizable(false)]
    [Themeable(true)]
    [System.Drawing.ToolboxBitmap(typeof(DropDownList))]
    public abstract class BusinessDDLBase<T> : DropDownList
    {
        #region 通用方法
        protected V GetPropertyValue<V>(string propertyName, V nullValue)
        {
            if (ViewState[propertyName] == null)
            {
                return nullValue;
            }
            return (V)ViewState[propertyName];
        }

        protected void SetPropertyValue<V>(string propertyName, V value)
        {
            ViewState[propertyName] = value;
        }
        #endregion

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            if (!DesignMode && (!Page.IsPostBack || NeedReBind))
            {
                if (DelayBindType == EnumDelayBindType.ConditionAuto || DelayBindType == EnumDelayBindType.Auto)
                    FillDropDownList();

                NeedReBind = false;
            }
        }

        /// <summary>
        /// 填充列表
        /// </summary>
        public abstract void FillDropDownList();

        [DefaultValue(false)]
        [Category("Behavior")]
        public bool IsNullable
        {
            get
            {
                return GetPropertyValue("IsNullable", false);
            }
            set
            {
                SetPropertyValue("IsNullable", value);
                //base.AppendDataBoundItems = value;
            }
        }

        [Description("0:将在OnInit绑定;1:将在OnLoad后绑定,设置查询范围属性,自动加载;2:完全手工操作")]
        [DefaultValue(EnumDelayBindType.Auto)]
        [Category("Behavior")]
        public EnumDelayBindType DelayBindType
        {
            get
            {
                return GetPropertyValue("DelayBindType", EnumDelayBindType.Auto);
            }
            set
            {
                SetPropertyValue("DelayBindType", value);
            }
        }

        ///// <summary>
        ///// 选中的项
        ///// </summary>
        //[Browsable(false)]
        //public T SelectedEntity
        //{
        //    get
        //    {
        //        if (SelectedGuid != Guid.Empty)
        //            return CObject<T>.Load(new Guid(base.SelectedValue));
        //        else
        //            return default(T);
        //    }
        //    set
        //    {
        //        if (Contains(value))
        //            SetSelectedValue(value);
        //    }
        //}

        /// <summary>
        /// 选中的项主键
        /// </summary>
        [Browsable(false)]
        public Guid SelectedGuid
        {
            get
            {
                if (base.SelectedIndex == -1 || string.IsNullOrEmpty(base.SelectedValue))
                    return Guid.Empty;
                else
                    return new Guid(base.SelectedValue);
            }
            set
            {
                if (base.Items.FindByValue(value.ToString()) != null)
                    base.SelectedValue = value.ToString();
            }
        }

        protected abstract void SetSelectedValue(T value);

        /// <summary>
        /// 是否存在
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public abstract bool Contains(T value);

        /// <summary>
        /// 是否需要重新绑定
        /// </summary>
        [Category("Behavior")]
        [DefaultValue(false)]
        public bool NeedReBind
        {
            get
            {
                return GetPropertyValue("NeedReBind", false);
            }
            set
            {
                SetPropertyValue("NeedReBind", value);
            }
        }

        [Browsable(false)]
        public override bool EnableViewState
        {
            get
            {
                return base.EnableViewState;
            }
            set
            {
                base.EnableViewState = value;
            }
        }

        protected ListItem getListItemWithTitle(string text, string value)
        {
            ListItem item = new ListItem(text, value);

            item.Attributes.Add("title", text);

            return item;

        }
    }
}

